We use a caller-saves convention. The caller explicitly emits saving and restoring code. Tail-recursive calls don't need any register saving since we never come back.